package com.eg366.nioLearn.simple;

import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

/**
 * NIO中，任何时候执行一个读操作，都是从通道中读（channel）；所有数据都驻留在缓冲区（buffer）中，是从通道读到缓冲区中。
 * 步骤：(1)从FileInputStream获取Channel;(2)创建buffer;(3);将数据从Channel读取到Buffer中
 */
public class NioRead {

	public static void main(String[] args) throws IOException {
		int bufsize = 25;
		/* 用于保存最后输出结果的字节数组缓冲 */
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		/* 内容：abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz  两个a-z，缓冲区长度声明为25 */
		FileInputStream fis = new FileInputStream("readnio.txt");
		/* 获取通道 */
		FileChannel channel = fis.getChannel();
		/* 创建缓冲区 */
		ByteBuffer buffer = ByteBuffer.allocate(bufsize);	// [pos=0 lim=25 cap=25]
		int readCount = 0;
		byte[] dst = null;
		/* 将数据从通道读入缓冲区 */
		/* capacity:指定了可以存储在缓冲区中的最大数据容量，实际上，它指定了底层数组的容量大小 */
		/* position:指定了下一个将要被写入或者读取的元素索引,此处指总共读取了多少数据;新创建时,初始为0 */
		/* limit:指定还有多少数据需要取出(在从缓冲区写入通道时)，或者还有多少空间可以放入数据(在从通道读入缓冲区时)。 */
		while (channel.read(buffer) != -1) {	// [pos=25 lim=25 cap=25]
			dst = new byte[bufsize];
			buffer.flip();	// 第一、二次：[pos=0 lim=25 cap=25]；第三次：[pos=0 lim=2 cap=25]
			buffer.get(dst, 0, buffer.limit());
			baos.write(dst);
			readCount++;
			System.out.println("readCount=" + readCount + ";\n<content>" + new String(dst) + "</content>");
			buffer.clear();
		}
		/* 输出结果 */
		System.out.println(new String(baos.toByteArray()));
		channel.close();
		fis.close();
		baos.close();
	}
}
